#include <iostream>
using namespace  std;

//1.单独定义引用时 必须初始化 说明像一个常量
int main01(int argc, char const *argv[]){
        //const int c1=100;

        int a = 10;
        int &b = a; //b很像一个常量需要初始化

        printf("&a:%d \n", &a);
        printf("&b:%d \n", &b); //a和b的地址一样  a和b就是同一块内存空间的门牌号

        return 0;
}

//2 普通引用有自己的空间? 有
struct Teacher
{
        char name[64]; //64
        int age;//8

        int &a; // 8 //很像指针 所占的内存空间大小
        int &b; // 8
};
// 3 引用的本质
void modifyA(int &a1){
        a1 = 100;
}
void modifyA2(int * const a1){
        *a1 = 10; //*实参的地址 , 去间接的修改实参的值
}
int main02(int argc, char const *argv[]){
        //char *const p;
        int a = 10;
        
        //1
        modifyA(a); //执行这个函数调用的时候 我们程序员不需要取a的地址
        printf("a: %d \n", a);

        //2
        modifyA2(&a); //如果是指针 需要我们程序员手工的取实参的地址
        printf("a: %d \n", a);

        printf("sizeof(Teacher): %d \n", sizeof(Teacher)); //88
        return 0;
}

//间接赋值成立的三个条件
void modifyA3(int *p){
                *p = 200; //*p 3. *p形参取简介修改实参的值
}
int main(int argc, char const *argv[]){
        int a = 10;
        int *p = NULL; //简介赋值成立的三个条件 1.定义两个变量

        p = &a;
        *p = 100;

        modifyA3(&a); //2 建立关联

        return 0;
}

//123 写在一块
//12 写在一块  3单独在函数里面
//1单独写  23写在另外一个地方 函数里面  这就是引用应用的本质
